package client;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import javax.swing.JOptionPane;

import model.Usuario;
import protocol.MensajeComando;

import comandos.ComandoCliente;
import comandos.ComandoManejador;
import comandos.ProtocoloTateti;

public class ClienteSession implements Runnable
{
	private	Socket clientSocket;
	 private ObjectInputStream input;
	 private ObjectOutputStream output;
	 private boolean activo = true;
	 private Usuario usuario;
	
	 
	 public ClienteSession (String direccionIp, int puerto) throws Exception
	 {
		 try
		 {
			 this.clientSocket = new Socket (direccionIp,puerto);
			 
		 }
		 catch (Exception e)
		 {
			 throw new Exception ("No pudo establecerse la conexion con el servidor");
		 }
		 
		 try
		 {
			 this.output = new ObjectOutputStream(clientSocket.getOutputStream());
			 this.output.flush();
			 this.input = new ObjectInputStream(clientSocket.getInputStream());
	         
			 ProtocoloTateti.getInstance().setSession(this);
		 }
		 catch (Exception e)
		 {
			 throw new Exception ("No pudo obtenerse el Stream del cliente");
		 }
		 
	 }
	 
	 public synchronized void run()
	 {
		 
		 try
		 {
			 while (this.activo)
			 {
				 
					 MensajeComando mensajeServer = (MensajeComando) this.input.readObject();
					 ComandoCliente comando = ComandoManejador.obtenerComando(mensajeServer.getMensaje()); 
					 //El manejador de comandos me devuelve el objeto comando correspondiente, 
					 //Como las llegadas de estos mensajes provienen del servidor cuando ejecuto le indico al cliente que el comando proviene del servidor (segundo parametro true)
					comando.ejecutar(this, true);
			 }
			 this.clientSocket.close();
		 }
		 catch (Exception e){
			 JOptionPane.showMessageDialog(null, "Se deconecto del servidor");
			 e.printStackTrace();
		 }
	}
	 
	 public void matarHilo()
	 {
		 this.activo = false;
	 }

	public Socket getClientSocket() {
		return clientSocket;
	}

	public void setClientSocket(Socket clientSocket) {
		this.clientSocket = clientSocket;
	}

	public ObjectInputStream getInput() {
		return input;
	}

	public void setInput(ObjectInputStream input) {
		this.input = input;
	}

	public ObjectOutputStream getOutput() {
		return this.output;
	}

	public void setOutput(ObjectOutputStream output) {
		this.output = output;
	}

	public boolean isActivo() {
		return activo;
	}

	public void setActivo(boolean activo) {
		this.activo = activo;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	 
	 
}
